package com.prj.ufdm.cloud.ms.test.bpo._impl.jsontable;

import java.util.ArrayList;
import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import com.prj.ufdm.cloud.ms.test.bpo.dbtable.DbTableBPO;
import com.prj.ufdm.cloud.ms.test.bpo.dbtable.DbTableColumnBPO;
import com.prj.ufdm.cloud.ms.test.bpo.jsontable.FastJsonTableBPO;
import com.prj.ufdm.cloud.ms.test.model.dbtable.DbTable;
import com.prj.ufdm.cloud.ms.test.model.dbtable.DbTableColumn;
import com.prj.ufdm.cloud.ms.test.model.jsontable.FastJsonTable;

/**
 * DESC: 表操作接口实现类  <br>
 * @author 胡义振
 * @date 2020年3月14日
 */
@Service(value="fastJsonTableBPO")
public class FastJsonTableBPOImpl implements FastJsonTableBPO {

    @Autowired
    private DbTableBPO dbTableBPO;
    @Autowired
    private DbTableColumnBPO dbTableColumnBPO;
	
	/**
	 * DESC: 生成表操作 SQL语句
	 * @auther 胡义振
	 * @date 2020年3月3日
	 * @param jsonTableList
	 * @return 
	 * @return
	 */
	@Override
	public String operateTableSql(List<FastJsonTable>  jsonTableList) {
		List<String> executeSqlList = new ArrayList<String>();
		for(FastJsonTable jsonTable: jsonTableList) {
			// Json中的表名
			String tableName = jsonTable.getTableName(); 
			// 要执行的SQL
			StringBuffer executeSql = new StringBuffer("");
			// 查询表，判断表是否存在
			DbTable existTable = dbTableBPO.doGetTableByTableName(tableName);
			// 表存在
			if(existTable!=null) {
				// 添加表字段SQL
				executeSql.append(addColumnSql(jsonTable));
			}
			else {
				// 创建表SQL
				executeSql.append(createTableSql(jsonTable));
			}
			executeSqlList.add(executeSql.toString());
		}
		return String.join("\n",executeSqlList);
	}


	
	/**
	 * DESC: 根据 FastJsonTable 生成添加字段的SQL语句
	 * @auther 胡义振
	 * @date 2020年3月4日
	 * @param tableName
	 * @param jsonColumnList
	 * @return 
	 * @return
	 */
	private String addColumnSql(FastJsonTable jsonTable){
		
		// Json中的表名
		String tableName = jsonTable.getTableName(); 
		// Json中的列名
		List<DbTableColumn> jsonColumnList = jsonTable.getTableColumns();
		
		StringBuffer alterSql = new StringBuffer("");
		// 查询表中字段
		List<DbTableColumn> tableColumnList = dbTableColumnBPO.doGetTableColumnByTableName(tableName);
		
		// 新增加的列
		List<DbTableColumn> addColumnList = new ArrayList<DbTableColumn>();
		for(DbTableColumn fastJsonColumn : jsonColumnList) {
			// 判断列是否存在
			boolean columnExist = tableColumnList.stream().anyMatch( t -> t.getColumnName().toLowerCase().equals(fastJsonColumn.getColumnName().toLowerCase()));
			if(!columnExist) {
				addColumnList.add(fastJsonColumn);
			}
		}
		// 添加字段
		if(addColumnList!=null && addColumnList.size()>0) {
			alterSql.append("ALTER TABLE " + tableName );
			for(int i=0;i<addColumnList.size();i++) {
				if(i!=addColumnList.size()-1) {
					alterSql.append(" ADD "+addColumnList.get(i).getColumnName()+" "+addColumnList.get(i).getColumnType()+"("+addColumnList.get(i).getColumnLength()+"),");
				}
				else {
					alterSql.append(" ADD "+addColumnList.get(i).getColumnName()+" "+addColumnList.get(i).getColumnType()+"("+addColumnList.get(i).getColumnLength()+")");
				}
			}
			alterSql.append(";");
		}
		return alterSql.toString();
	}
	
	/**
	 * DESC: 根据 FastJsonTable 生成创建表的SQL
	 * @auther 胡义振
	 * @date 2020年3月4日
	 * @param jsonTable
	 * @return 
	 * @return
	 */
	private String createTableSql(FastJsonTable jsonTable){
		// Json中的列名
		List<DbTableColumn> jsonColumnList = jsonTable.getTableColumns();
		StringBuffer createSql = new StringBuffer("");
		// 新增表
		createSql.append("CREATE TABLE " + jsonTable.getTableName() + "(");
		jsonColumnList.stream().map( t -> t.getColumnName().concat(" "+t.getColumnType()+"("+t.getColumnLength()+"),")).forEach(t -> createSql.append(t));
		createSql.append("PRIMARY KEY ("+jsonTable.getTableId()+")");
		createSql.append(") ENGINE=InnoDB DEFAULT CHARSET=utf8 ;");
		return createSql.toString();
	}
}
